package com.atguigu.java8.demo;

import java.util.Comparator;

/**
 * Created by Smexy on 2022/9/8
 *
 *      匿名内部类的形式和lamda表达式的形式只是书写方式不同，功能一模一样
 *
 *      lamda表达式的格式:
 *              (o1, o2): 参数列表。写的就是必须实现的方法所传入的参数。类型可以省略，由jvm去推断，也可以明确声明。
 *                  ->  ： lamda 运算符
 *              { return Integer.compare(o1,o2); }： 函数体
 *
 *          规则： 在函数体中，如果只有一行代码，那么 {}可以省略
 *                如果{}省略了，那么return也可以省略
 *                参数列表中，只有一个参数，()可以省略
 *                参数类型，可以不写，由jvm去推断
 *
 *
 *     什么情况下可以用lamda表达式:
 *              如果编写一个匿名实现类，这个类所实现的接口上标注了@FunctionalInterface。
 *              以为这个接口只有一个实现方法，可以使用 lamda表达式
 *
 *    --------------------
 *      不会写。用匿名内部类去写。
 *              在idea上，鼠标移动上去，自动替换。
 */
public class LamdaDemo2
{
    public static void main(String[] args) {

        Comparator<Integer> com1 = (o1, o2) -> {
         //无法使用方法引用的，因此以下代码不是某一个方法
               /* if (o1 > o2 ){
                    return 1;
                }else{
                    return 2;
                }*/
            return Integer.compare(o1,o2);
        };

        int compare1 = com1.compare(12,21);
        System.out.println(compare1);

        System.out.println("***********************");
        //Lambda表达式的写法
        Comparator<Integer> com2 = (o1,o2) -> Integer.compare(o1,o2);

        int compare2 = com2.compare(32,21);
        System.out.println(compare2);


        System.out.println("***********************");
        /*
                方法引用

                代表 com3这个Comparator 其中因为只有一个实现方法叫 compare。

                    取 Integer这个类中的 compare方法，作为 Comparator 中 compare的实现
         */
        Comparator<Integer> com3 = Integer :: compare;

        int compare3 = com3.compare(32,21);
        System.out.println(compare3);

    }
}
